#ifndef MODBUS_TCP_SERVER_HEADER
#define MODBUS_TCP_SERVER_HEADER

#include <stdint.h>


// 相机modbus输出地址(fun-code:0x04)
#define TIE_ALGO_TPYE_ADDR          0x00 // 算法类型
#define TIE_STRICKLE_STATUS_ADDR    0x01 // 刮板拉斜结果
#define TIE_STRICKLE_ANGLE_ADDR     0x02 // 刮板角度
#define TIE_VOLUME_METRIC_ADDR      0x04 // 体积 or 重量
#define TIE_VOLUME_INSTANT_ADDR     0x05 // 瞬时值
#define TIE_VOLUME_BAN_ACC_ADDR     0x07 // 班组累计值
#define TIE_VOLUME_ALL_ACC_ADDR     0x09 // 总体累计值
#define TIE_VOLUME_DEVICE_ADDR      0x0b // 激光出错
#define TIE_BELT_STATUS_ADDR        0x0c // 皮带撕裂结果
#define TIE_DEBRIS_STATUS_ADDR      0x0d // 大块卡料结果
#define TIE_SPRAYER_STATUS_ADDR     0x0e // 喷淋检测结果
#define TIE_TARPAULIN_STATUS_ADDR   0x0f // 苫布检测结果
#define TIE_GIGE_EXCEPTION_ADDR     0X10 // 工业相机异常

// 外部信号输入：0x06
#define STOP_SIGNAL_ADDR 0x00 // 启停信号
#define GIGE_FPS_ADDR 0X01 // 帧率
#define GIGE_EXPOSURE_ADDR 0X02  // 曝光时长
#define GIGE_EXTERNAL_TRIGGER_MODE_ADDR 0x03 // 外触发模式
#define BEAM_SIGNAL_ADDR 0x04 // 对射传感器信号
#define BEAM_DELAY_TIME_ADDR 0x05 // 传感器延迟时间
#define GIGE_CONNECTED 0x06 //配置是否连接工业相机，如果连接了工业相机，程序初始化时会一直尝试连接，直至连接成功

// 默认端口号
#define MODBUS_DEFAULT_PORT 502

/**
 * @brief 启动modbustcp模块
 * 
 * @param host ip地址
 * @param port 端口，默认502
 * @return int 
 */
int modbus_start(const char* host, int port);

/**
 * @brief 停止模块
 * 
 * @return int 
 */
int modbus_stop();

/**
 * @brief 设置输入寄存器值，短整型
 * 
 * @param value 值
 * @param address 地址
 */
void set_input_register_uint16(uint16_t value, int address);

/**
 * @brief 设置输入寄存器值，浮点型
 * 
 * @param value 
 * @param address 
 */
void set_input_register_float_dcba(float value, int address);

int get_holding_register_uint16(int address);

void set_holding_register_uint16(uint16_t value, int address);


// 请求外部停车信号
int request_stop_signal();

// 苫布报警
void set_tarpa_alarm();
void reset_tarpa_alarm();
void fill_tarpa_alarm();

// 喷淋报警
void set_spray_alarm();
void reset_spray_alarm();
void fill_spray_alarm();

// 对射传感器通过modbus给别的模块
void set_beam_signal();
int is_beam_signal_set();
void reset_beam_signal();

// 获取传感器软延迟时间
int get_beam_delay_time();

// 设置工业相机异常
void set_gige_normal();
// 设置工业相机正常
void set_gige_exception();

// 是否连接工业相机
int get_gige_connected();

// 设置工业相机属性
void set_all_gige_propertise();
#endif